<?php
/**
 * @Author:      lyt
 * @DateTime:    2016-02-18 17:05:55
 * @Description: 门店的入库单
 */
class MaintenanceStorageList extends Eloquent
{
    protected $table = "maintenance_storage_list";

    /**
     * @Author:      lyt
     * @DateTime:    2016-02-27 16:13:25
     * @Description: 传入一个 批量临时入库单 执行该批量临时入库单
     * 该方法只适用于 商品执行入库 不适用于 退库等其他 入库操作
     */
    public static function implement($msl,$user_id){
    	return DB::transaction(function () use ($msl,$user_id) {
    	    $time=date('Y-m-d H:i:s',time());
    		$msi=MaintenanceStorageItem::where("list_id",$msl->id)->where("status",0)->get();
            if(sizeof($msi)<=0){//说明该入库单是空的
                $response = Lang::get("scs_error.maintenance_storage_empty_60016");
                return $response;
            }
    		foreach ($msi as $_msi) {
    			$mw=MaintenanceWarehouse::where("shop_id",$msl->shop_id)->where("item_id",$_msi->item_id)->first();
    			//查询该耗材的 在门店的 库存  如果存在  添加数量如果不存在 新建
    			if($mw){
    				$mw->number=$mw->number+$_msi->number;
    				$mw->save();
    			}else{
    				$mw=new MaintenanceWarehouse;
    				$mw->item_type=$_msi->item_type;
    				$mw->item_id=$_msi->item_id;
    				$mw->shop_id=$msl->shop_id;
    				$mw->number=$_msi->number;
    				$mw->save();
    			}
    			//记录 库存操作记录
    			$mwf=new MaintenanceWarehouseFlow;
    			$mwf->mw_id=$mw->id;
    			$mwf->type=1;//入库
    			$mwf->item_id=$_msi->id;
    			$mwf->number=$_msi->number;
    			$mwf->created_by=$user_id;
    			$mwf->save();
    			//更改 耗材入库单的状态
    			$_msi->status=1;
    			$_msi->implement_time=$time;
    			$_msi->save();
    		}
    		//更改入库单 的状态 执行的操作人
    		$msl->status=1;
    		$msl->implement_by=$user_id;
    		$msl->implement_time=$time;
    		$msl->save();
            return array('code' => 0, 'msg' => 'ok', 'result' => array("id"=>$msl->id));
        });
    }



    /**
     * @Author:      lyt
     * @DateTime:    2016-03-10 09:33:08
     * @Description: 传入一个 领用退库入库单  执行该批量临时入库单的 入库操作
     * 该方法 只是用于 领用退库 不适用其他操作
    */
    public static function implementReturn($msl,$user_id){
        return DB::transaction(function () use ($msl,$user_id) {
            $time=date('Y-m-d H:i:s',time());
            $msi=MaintenanceStorageItem::where("list_id",$msl->id)->where("status",0)->get();
            if(sizeof($msi)<=0){//说明该入库单是空的
                $response = Lang::get("scs_error.maintenance_storage_empty_60016");
                return $response;
            }
            foreach ($msi as $_msi) {
                //查找出库记录 修改退货数量 记录
                $moi=MaintenanceOutItem::find($_msi->out_id);
                if($moi->number-$moi->return_numer<$_msi->number){
                    DB::rollback();
                    $response = Lang::get("scs_error.maintenance_out_numbererror_60006");
                    $response["result"]=array($_msi->name.'' .$_msi->model." 数量".$_msi->number."超过可退库数量");
                    return $response;
                }
                $moi->return_numer=$moi->return_numer+$_msi->number;
                $moi->save();
                //修改入库记录的使用个数  将退的货物 退回 原来的 入库耗材批次中
                $msi=MaintenanceStorageItem::find($moi->storage_id);
                $msi->current_number=$msi->current_number+$_msi->number;
                $msi->save();
                // 修改库存的数量
                $mw=MaintenanceWarehouse::where("shop_id",$msl->shop_id)->where("item_id",$_msi->item_id)->first();
                $mw->number=$mw->number+$_msi->number;
                $mw->save();
                //添加库存的修改记录
                $mwf=new MaintenanceWarehouseFlow;
                $mwf->mw_id=$mw->id;
                $mwf->type=1;//入库
                $mwf->item_id=$_msi->id;
                $mwf->number=$_msi->number;
                $mwf->created_by=$user_id;
                $mwf->save();
                //更改 耗材入库单的状态
                $_msi->status=1;
                $_msi->implement_time=$time;
                $_msi->save();
            }
            //更改入库单 的状态 执行的操作人
            $msl->status=1;
            $msl->implement_by=$user_id;
            $msl->implement_time=$time;
            $msl->save();
            return array('code' => 0, 'msg' => 'ok', 'result' => array("id"=>$msl->id));
        });
    }

    /**
     * @Author:      lyt
     * @DateTime:    2016-03-05 10:31:44
     * @Description: 传入一个 退库申请的集合 和 用户 返回处理的结果
     */
    public static function implementOrder($return_orders,$user){
        return DB::transaction(function () use ($return_orders,$user) {
            $time=date('Y-m-d H:i:s',time());
            $msl=new MaintenanceStorageList;
            $id=Common::createId();
            $msl->id=$id;
            $msl->shop_id=$user->shop_id;
            $msl->date=date("Y-m-d",time());
            $msl->supplier=0;
            $msl->storage_type=2;//入库类型为 退货
            $msl->pay_type=0;
            $msl->status=1;
            $msl->cust_id=$user->id;
            $msl->type=3;
            $msl->desc="订单退货";
            $msl->create_by=$user->id;
            $msl->implement_by=$user->id;
            $msl->implement_time=$time;
            $msl->save();
            foreach ($return_orders as $_ro) {//循环处理 选定的 退库单
                //查找该退库单的 相应地出库申请单
                $moo=MaintenanceOutOrder::find($_ro->out_order_id);
                if(is_null($moo)||$moo->status!=2){
                    DB::rollback();
                    $response = Lang::get("scs_error.maintenance_out_order_statuserror_60010");
                    $response["result"]=array('编号' .$_ro->id."退库单 对应出库记录不存在");
                    return $response;
                }
                //查询该 耗材的仓库信息
                $mw=MaintenanceWarehouse::where("shop_id",$user->shop_id)->where("item_id",$_ro->item_id)->first();
                //添加退货的时候进行数量判断  此处不进行 数量判断
                //查找该出库申请单 对应的的 出库耗材批次
                $moi=MaintenanceOutItem::getReturnStorageItem($moo,$_ro->number);// 返回的结果包含 该出库申请对应的出库记录 的可退数量和 出库记录对应的入库记录
                foreach ($moi as $_moi) {
                    //查找出库记录 修改退货数量 记录
                    $_mo=MaintenanceOutItem::find($_moi->id);
                    $_mo->return_numer=$_mo->return_numer+$_moi->user_number;
                    $_mo->save();
                    //修改入库记录的使用个数  将退的货物 退回 原来的额入库耗材批次中
                    $msi=MaintenanceStorageItem::find($_moi->ms_id);
                    $msi->current_number=$msi->current_number+$_moi->user_number;
                    $msi->save();
                    //添加 该订单退货的 的入库耗材批次
                    $msi=new MaintenanceStorageItem;
                    $msi->list_id=$id;
                    $msi->tax_purchase_price=$_mo->tax_purchase_price;
                    $msi->no_tax_purchase_price=$_mo->no_tax_purchase_price;
                    $msi->production_date=0;
                    $msi->tax_plan_costs=0;
                    $msi->no_tax_plan_costs=0;
                    $msi->number=$_moi->user_number;
                    $msi->tax_purchase_subtotal=$msi->tax_purchase_price*$msi->number;
                    $msi->current_number=0;
                    $msi->location="";
                    $msi->production_date=date("Y-m-d",time());//次数 date 无用
                    $msi->own_id=$user->id;
                    $msi->data_id=$_mo->data_id;
                    $msi->item_type=$_ro->type;
                    $msi->item_id=$_ro->item_id;
                    $msi->pack_unit=0;
                    $msi->shop_id=$user->shop_id;
                    $msi->type=2;//2 是退库
                    $msi->status=1;
                    $msi->created_by=$user->id;
                    // if($_ro->type==0){//说明是 标准耗材
                        $si=SupplyItem::find($_ro->item_id);
                        $msi->code=$si->code;
                        $msi->name=$si->name;
                        $msi->subject=$si->supply_classification_id;
                        $msi->model=$si->model;
                    // }else{
                    //     $sins=SupplyItemNonStandard::find($_ro->item_id);
                    //     $msi->code=$sins->code;
                    //     $msi->name=$sins->name;
                    //     $msi->subject=$sins->subject;
                    //     $msi->model=$sins->model;
                    // }
                    $msi->out_id=$_mo->id;//6-30 新添加用于回溯 数据用的 
                    $msi->return_order_id=$_ro->id;
                    $msi->implement_time=$time;
                    $msi->save();
                    //添加库存的修改记录
                    $mwf=new MaintenanceWarehouseFlow;
                    $mwf->mw_id=$mw->id;
                    $mwf->type=1;//入库
                    $mwf->item_id=$msi->id;
                    $mwf->number=$msi->number;
                    $mwf->created_by=$user->id;
                    $mwf->save();
                }
                //修改 该出库申请的退货个数
                if($moo->return_number+$_ro->number==$moo->number){
                    $moo->status=3;//如果已经退完货  该条出库申请 改为 已经退货
                }
                $moo->return_number=$moo->return_number+$_ro->number;
                $moo->save();



                // 修改库存的数量
                $mw->number=$mw->number+$_ro->number;
                $mw->save();
                
                //修改订单的 产品信息
                $order=Orders::find($_ro->order_id);
                switch ($_ro->product_type) {
                    case 'base':
                        $opbi=OrderProductBaseItem::find($_ro->product_item_id);
                        $op=OrderProduct::find($opbi->order_product_package_id);
                        //添加更改纪录
                        $opr=new OrderProductRecord();
                        $opr->order_id=$order->order_id;
                        $opr->product_type='base';
                        $opr->operation_type='update';
                        $opr->num=$opbi->num;
                        $opr->operation_grade='二级';
                        $opr->user_id=$user->id;
                        $opr->user_type='sc';
                        $opr->operation_id=$opbi->id;
                        $opr->name=$opbi->item_name;
                        $opr->amount=$opbi->amount;
                        $opr->save();
                        $opbi->num=$opbi->num-$_ro->number;
                        $opbi->save();
                        
                        //订单应付金额及优惠信息将重新计算，废弃原有再优惠信息上加减
                        Orders::calculate($order->order_id);
                        break;
                    case 'non_standard':
                        $opns=OrderProductNonStandard::where('id',$_ro->product_item_id)->where('status',1)->first();
                        $op=OrderProduct::find($opns->order_product_id);
                        //添加更改纪录
                        $opr=new OrderProductRecord();
                        $opr->order_id=$order->order_id;
                        $opr->product_type='non_standard';
                        $opr->operation_type='update';
                        $opr->num=$opns->num;
                        $opr->operation_grade='二级';
                        $opr->user_id=$user->id;
                        $opr->user_type='sc';
                        $opr->operation_id=$opns->id;
                        $opr->name=$opns->name;
                        $opr->amount=$opns->amount;
                        $opr->save();
                        $opns->num=$opns->num-$_ro->number;
                        $opns->save();
                        
                        //订单应付金额及优惠信息将重新计算，废弃原有再优惠信息上加减
                        Orders::calculate($order->order_id);
                        
                        break;
                    case 'promotion':
                        // DB::rollback();
                        // $response = Lang::get("scs_error.maintenance_out_order_statuserror_60010");
                        // $response["result"]=array('编号' .$_ro->id."退库单 标准产品不能退库");
                        // return $response;
                        break;
                    case 'service_card':
                        $opbi=OrderProductScItem::find($_ro->product_item_id);
                        $op=OrderProduct::find($opbi->order_product_id);
                        //添加更改纪录
                        $opr=new OrderProductRecord();
                        $opr->order_id=$order->order_id;
                        $opr->product_type='service_card';
                        $opr->operation_type='update';
                        $opr->num=$opbi->num;
                        $opr->operation_grade='二级';
                        $opr->user_id=$user->id;
                        $opr->user_type='sc';
                        $opr->operation_id=$opbi->id;
                        $opr->name=$opbi->item_name;
                        $opr->amount=$opbi->amount;
                        $opr->save();
                        $opbi->num=$opbi->num-$_ro->number;
                        $opbi->save();
                        
                        //订单应付金额及优惠信息将重新计算，废弃原有再优惠信息上加减
                        Orders::calculate($order->order_id);
                        break;
                    case 'enterprise':
                        $opei=OrderProductEsItem::find($_ro->product_item_id);
                        $opep=OrderProductEsPackage::find($opei->order_product_package_id);
                        $temp_amount=$_ro->number*$opei->amount;
                        //添加更改纪录
                        $opr=new OrderProductRecord();
                        $opr->order_id=$order->order_id;
                        $opr->product_type='enterprise';
                        $opr->operation_type='update';
                        $opr->num=$opei->num;
                        $opr->operation_grade='三级';
                        $opr->user_id=$user->id;
                        $opr->user_type='sc';
                        $opr->operation_id=$opei->id;
                        $opr->name=$opei->item_name;
                        $opr->amount=$opei->amount;
                        $opr->save();
                        $opei->num=$opei->num-$_ro->number;
                        $opei->save();
                        
                        //订单应付金额及优惠信息将重新计算，废弃原有再优惠信息上加减
                        Orders::calculate($order->order_id);
                        break;
                    case 'activity':
                        $opaci=OrderProductAcItem::find($_ro->product_item_id);
                        $opacp=OrderProductAcPackage::find($opaci->order_product_package_id);
                        $temp_amount=$_ro->number*$opaci->amount;
                        //添加更改纪录
                        $opr=new OrderProductRecord();
                        $opr->order_id=$order->order_id;
                        $opr->product_type='activity';
                        $opr->operation_type='update';
                        $opr->num=$opaci->num;
                        $opr->operation_grade='三级';
                        $opr->user_id=$user->id;
                        $opr->user_type='sc';
                        $opr->operation_id=$opaci->id;
                        $opr->name=$opaci->item_name;
                        $opr->amount=$opaci->amount;
                        $opr->save();
                        $opaci->num=$opaci->num-$_ro->number;
                        $opaci->save();
                    
                        //订单应付金额及优惠信息将重新计算，废弃原有再优惠信息上加减
                        Orders::calculate($order->order_id);
                        break;
                }
                //更改 退库申请 为成功
                $_ro->status=1;
                $_ro->save();
            }
            return array('code' => 0, 'msg' => 'ok', 'result' => array("id"=>$id));
        });
    }
}